package com.MartynovichIgor.KnowledgeTest.tools.testtools;

import com.MartynovichIgor.KnowledgeTest.tools.admintools.Admin;
import com.MartynovichIgor.KnowledgeTest.tools.admintools.AdminAction;
import com.MartynovichIgor.KnowledgeTest.tools.admintools.AdminChecker;
import com.MartynovichIgor.KnowledgeTest.tools.filetools.FileLoader;
import com.MartynovichIgor.KnowledgeTest.tools.usertools.Loader;
import com.MartynovichIgor.KnowledgeTest.tools.usertools.UserSaver;
import com.MartynovichIgor.KnowledgeTest.tools.usertools.User;
import com.MartynovichIgor.KnowledgeTest.tools.usertools.UserAction;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.ResourceBundle;

/**
 * Created by:
 * User: Igor Martynovich and Guzenko Igor
 * Date: 12.10.13
 */
public class TestController {
    private BufferedReader reader;
    private static ResourceBundle languageChooser;
    public final static int COUNT_OF_QUESTIONS = 10;

    public TestController() {
        reader = new BufferedReader(new InputStreamReader(System.in));
    }

    public void startTest() throws IOException {
        languageChooser = new LanguageChooser().languageChooser();
        setUserActivity();
    }

    /**
     * Метод для выполнения тестов.
     * @param user
     * @throws IOException
     */
    private void performTest(User user) throws IOException {
        if (user == null) {
            System.out.printf("%s", languageChooser.getString("loginAgain"));
            setUserActivity();
        }
        System.out.printf("%s", languageChooser.getString("help"));
        UserAction action = new UserAction(user);
        action.userActionHandler();
        System.out.printf("%s%d", languageChooser.getString("Score"), action.getUserScore());

    }

    public static ResourceBundle getLanguageChooser() {
        return languageChooser;
    }

    /**
     * Метод для выбора регистрации или логина.
     * @throws IOException
     */
    private void setUserActivity() throws IOException {
        System.out.printf("%s", languageChooser.getString("registration"));
        String userInput = reader.readLine().toLowerCase();
        while ((!userInput.equals("register")) && (!userInput.equals("login"))) {
            System.out.printf("%s", languageChooser.getString("registrationValidation"));
            userInput = reader.readLine().toLowerCase();
        }
        if (userInput.equals("register")) {
            User newUser = registration();
            performTest(newUser);
        } else {
            String userLogin = reader.readLine();
             if(new AdminChecker().isAdmin(userLogin)) {
                 Admin newAdmin = new Admin();
                 AdminAction action = new AdminAction(newAdmin, languageChooser);
                 action.performActions();
             }
            else {
            User loggedUser = login(userLogin);
            performTest(loggedUser);
            }
        }
    }

    /**
     * Метод для того что б залоиниться.
     * @return Взвращает обьект User.
     * @throws IOException
     */
    private User login(String userLogin) throws IOException {
        System.out.printf("\n%s", languageChooser.getString("login"));

        Loader userLoader = new Loader();
        return userLoader.loadUserInfo(userLogin, languageChooser);
    }

    /**
     * Метод для регистрации.
     * @return Возвращает обьект класса User созданого с истории.
     * @throws IOException
     */
    private User registration() throws IOException {
        System.out.printf("\n%s", languageChooser.getString("login"));
        String login = getCheckedLogin();
        System.out.printf("\n%s", languageChooser.getString("pass"));
        String pass = getCheckedPass();
        ArrayList<Integer> newShuffledIndexes = new Shuffler().getShuffledIndexses(COUNT_OF_QUESTIONS);
        ArrayList<Integer> answersArray = getDefaultAnswersArray();
        User user;
        user = new User(login, pass, newShuffledIndexes, answersArray, languageChooser, 0);
        return user;
    }

    /**
     * Метод проверяет существует ли уже такой логин и если существует -
     * осуществляет валидацию для выбора нового.
     * @return Возвращает выбраный логин.
     * @throws IOException
     */
    private String getCheckedLogin() throws IOException {
        String checkedLogin = reader.readLine();
        while (checkLoginExists(checkedLogin) || checkedLogin.equals("")) {
            if (checkedLogin.equals("")) {
                System.out.printf("%s", languageChooser.getString("emptyLogin"));
            } else {
                System.out.printf("%s", languageChooser.getString("loginExists"));
            }
            checkedLogin = reader.readLine();
        }
        return checkedLogin;

    }

    /**
     * Метод осуществляет валидацию, пока пользователь не введет пароль.
     * @return
     * @throws IOException
     */
    private String getCheckedPass() throws IOException {
        String checkedPass = reader.readLine();
        while (checkedPass.equals("")) {
            System.out.printf("%s", languageChooser.getString("emptyPassword"));
            checkedPass = reader.readLine();
        }
        return checkedPass;
    }

    public static ArrayList<Integer> getDefaultAnswersArray() {
        ArrayList<Integer> array = new ArrayList<Integer>();
        for (int index = 0; index < COUNT_OF_QUESTIONS; index++) {
            array.add(-1);
        }
        return array;
    }

    /**
     * Метод ищет введенный логин в истории.
     * @param login
     * @return Если есть уже такой логин - true.
     * @throws IOException
     */
    private boolean checkLoginExists(String login) throws IOException {
        String loadedInfo = new FileLoader().readFile(UserSaver.USER_INFO_FILE);
        ArrayList<String> usersInfoArray = new Parser().getStringArray(loadedInfo, "\n");
        boolean isExists = false;
        for (String anUsersInfoArray : usersInfoArray) {
            if (new Parser().getStringArray(anUsersInfoArray, " ").get(0).equals
                    (login)) {
                isExists = true;
                break;
            }
        }
        return isExists;
    }
}
